package servlet;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.collections.CollectionUtils;

import dominio.Configuracion;
import bean.remote.ConfiguracionRemote;

public class ConfiguracionesModificarServlet extends HttpServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = 2189696639959913611L;

	@EJB(beanName = "configuracionBean")
	private ConfiguracionRemote configuracionRemote;

	@SuppressWarnings("unchecked")
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {

		List<Configuracion> all = configuracionRemote.findAll();
		Set<Configuracion> allSet = new HashSet<Configuracion>(all);

		String[] parameterValuesActiva = req.getParameterValues("activa");

		if (parameterValuesActiva != null && parameterValuesActiva.length > 0) {

			Set<Configuracion> configuracionesActivas = new HashSet<Configuracion>();

			for (int i = 0; i < parameterValuesActiva.length; i++) {
				String moduleId = parameterValuesActiva[i];

				Configuracion configuracion = buscarConfiguracion(allSet,
						Long.valueOf(moduleId));
				configuracion.setActiva(1);
				configuracionesActivas.add(configuracion);
				allSet.add(configuracion);
			}

			Collection<Configuracion> configuracionesNoActivas = CollectionUtils
					.disjunction(allSet, configuracionesActivas);

			for (Configuracion configuracion : configuracionesNoActivas) {
				configuracion.setActiva(0);
				allSet.add(configuracion);
			}
		} else {
			if (parameterValuesActiva == null) {
				for (Configuracion configuracion : all) {
					configuracion.setActiva(0);
					allSet.add(configuracion);
				}
			}
		}

		String[] parameterValuesSincronica = req
				.getParameterValues("sincronica");
		if (parameterValuesSincronica != null
				&& parameterValuesSincronica.length > 0) {
			List<Configuracion> configuracionesSincronicas = new ArrayList<Configuracion>();
			for (int i = 0; parameterValuesActiva != null
					&& i < parameterValuesSincronica.length; i++) {
				String moduleId = parameterValuesSincronica[i];
				Configuracion configuracion = buscarConfiguracion(allSet,
						Long.valueOf(moduleId));
				configuracion.setSincronico(1);
				configuracionesSincronicas.add(configuracion);
				allSet.add(configuracion);
			}
			Collection<Configuracion> configuracionesNoSincronicas = CollectionUtils
					.disjunction(all, configuracionesSincronicas);

			for (Configuracion configuracion : configuracionesNoSincronicas) {
				configuracion.setSincronico(0);
				allSet.add(configuracion);
			}
		} else {
			if (parameterValuesSincronica == null) {
				for (Configuracion configuracion : all) {
					configuracion.setSincronico(0);
					allSet.add(configuracion);
				}
			}
		}

		configuracionRemote.update(allSet);

	}

	private Configuracion buscarConfiguracion(Set<Configuracion> all,
			Long moduleId) {
		Configuracion configuracionBuscada = new Configuracion(moduleId);
		if (all.contains(configuracionBuscada)) {
			for (Configuracion configuracion : all) {
				if (configuracion.equals(configuracionBuscada)) {
					return configuracion;
				}
			}
		}
		return null;
	}
}
